<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background-color: red;
            position: absolute;
        }
    </style>
</head>

<body>
    <div class="box">

    </div>
</body>

</html>
<script>
    //一.拖拽效果:通过改变盒子的位置达到一个类似于拖拽的效果。
    //1.拖拽的事件类型
    //onmousedown：鼠标按下，确定鼠标离盒子左上角的距离不变的 (不变的短线) offsetX,offsetY
    //onmousemove：鼠标移动的时候，有一个不断变化的鼠标的位置(可视区的位置)，将鼠标的位置-不变的短线 将结果赋值给盒子的位置
    //onmouseup：拖拽结束(关闭上面的move事件)
    //2.拖拽的元素一定具有定位属性，改变元素的位置。

    var box = document.querySelector('.box');
    //第一步：求不变的短线
    box.onmousedown = function(ev) {
        var ev = ev || window.event;
        //存储不变的短线的值。
        var shortlinex = ev.offsetX;
        var shortliney = ev.offsetY;

        //第二步：先按下鼠标，进行move拖拽。
        //鼠标的位置(鼠标的位置是不断变化的，不断的获取)-不变的短线 将结果赋值给盒子的位置
        document.onmousemove = function(ev) {
            var ev = ev || window.event; //重新获取事件对象，鼠标的位置不断变化的。
            box.style.left = ev.clientX - shortlinex + 'px';
            box.style.top = ev.clientY - shortliney + 'px';
        };
        //第三步：结束拖拽 - 结束第二步的事件。将事件的值设为null就是取消事件。
        document.onmouseup = function() {
            document.onmousemove = null; //move事件取消了
            document.onmouseup = null; //一切都结束了，顺便把自己干掉。  优化。
        }
    }
</script>